package com.heima.comment.service.impl;

import com.heima.comment.service.CommentHotService;
import com.heima.model.comment.pojos.ApComment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @作者 itcast
 * @创建日期 2021/9/30 9:47
 **/
@Service
@Slf4j
public class CommentHotServiceImpl implements CommentHotService {

    @Autowired
    MongoTemplate mongoTemplate;

    @Async("taskExecutor") // 指定线程池异步处理请求
    @Override
    public void hotCommentExecutor(ApComment apComment) {
        log.info(" 异步计算热点评论  ==============   {}" ,apComment);
        // 1. 查询当前文章下的所有热点评论   (文章id   flag=1   点赞降序)
        // 参数1 条件  参数2 哪个集合
        Query query = Query.query(Criteria.where("articleId")
                .is(apComment.getArticleId())
                .and("flag").is(1)).with(Sort.by(Sort.Direction.DESC, "likes"));
        List<ApComment> hotComments = mongoTemplate.find(query, ApComment.class);
        // 2. 判断当前热点评论数量是否小于 5     直接将当前评论改为热点评论
        if(hotComments.size()<5){
            apComment.setFlag((short)1);
            mongoTemplate.save(apComment); // 修改热评
            return;
        }
        // 3. 如果大于等于5  那么取出热评的最后一条
        ApComment lastHotComment = hotComments.get(hotComments.size() - 1);
        //    和当前评论点赞数量做对比   谁的点赞多  谁改为热评 另一个改为普通评论
        if (apComment.getLikes() > lastHotComment.getLikes()) {
            apComment.setFlag((short)1);
            mongoTemplate.save(apComment); // 修改热评
            lastHotComment.setFlag((short)0);
            mongoTemplate.save(lastHotComment); // 修改普通评论
        }
    }
}
